In diesem Skript wird die Nutzenergie pro Gebäude mit unterschiedlichen Methoden geschätzt. Zum einen wird eine Methode des AWEL verwendet. Zum anderen werden Berechnung von
Anmerkung: Die AWEL Methode wird im Moment auf alle SIA Gebäudetypen in gleicher Art und Weise angewendet. Dies müsste in Zukunft noch angepasst werden (grosse Lagerhallen haben weniger Energiebedarf, als kleine EFH -> Diesbezüglich haben wir eine Tabelle zur Schätzung des Wärmebedars von Romand Energie in welcher die 12 SIA Kategorien von S. 43, SIA 380 miteinbezogen werden. Die Werte beruhen auf Messungen.).
Die Daten aus dem vorhergehenden Arbeitsschritt werden eingelesen. Zusätzlich werden ein paar Werte pro Gebäude berechnet, welche für die spätere Visualisierung der SIA Klassifikation informativ sind.
load("output/02_output/geom/02_rolle_bld_out.Rdata")
crsInput<-proj4string(rolle_bld_out)
#wärmebedarf geschätzt von stefan
#für rolle
energyDem_rolle_ss<-read.csv(paste(dataPath,"03_SteSchGenf/HeatDemand_Rolle.csv",sep=""),sep="\t")
#und ms-rolle
energyDem_msrolle_ss<-as.data.frame(fread(paste(dataPath,"03_SteSchGenf/HeatDemand_MontSurRolle.csv",sep=""),sep="\t",quote=""))
#combine the rolle's
energyDem_ss<-rbind(energyDem_msrolle_ss,energyDem_rolle_ss)
#wärmebedarf geschätzt vom Kanton Waadt, resp. Romand Energie
#...rolle
energyDem_re<-readOGR(layer = "DensiteThermPct", dsn = paste(dataPath,"10_Rolle",sep=""))
## OGR data source with driver: ESRI Shapefile
## Source: "/Volumes/data$/ta/60 FuE/6096 SCCER/609635 FEEBD-II/60963505 Work Packages/JA RED/06-Daten/10_Rolle", layer: "DensiteThermPct"
## with 1123 features
## It has 43 fields
## Integer64 fields read as strings: NUMERO_OFS CODE_EPOQU AFF_LOG AFF_ACT AE_CHAUF AE_ECS PROV_SRE_A PROV_SRE_L PROV_AFF_A PROV_AFF_L PROV_EPOQU PROV_AE_CH PROV_AE_EC PROV_RENOV NOTE_RECEN PROV_CONSO
energyDem_re<-spTransform(energyDem_re,CRSobj = crsInput)
#...ms-rolle
energyDem_re_ms<-readOGR(layer = "ms_rolle_densTherm", dsn = paste(dataPath,"10_Rolle",sep=""))
## OGR data source with driver: ESRI Shapefile
## Source: "/Volumes/data$/ta/60 FuE/6096 SCCER/609635 FEEBD-II/60963505 Work Packages/JA RED/06-Daten/10_Rolle", layer: "ms_rolle_densTherm"
## with 1602 features
## It has 44 fields
## Integer64 fields read as strings: NUMERO_OFS CODE_EPOQU AFF_LOG AFF_ACT AE_CHAUF AE_ECS PROV_SRE_A PROV_SRE_L PROV_AFF_A PROV_AFF_L PROV_EPOQU PROV_AE_CH PROV_AE_EC PROV_RENOV NOTE_RECEN PROV_CONSO
energyDem_re_ms<-spTransform(energyDem_re_ms,CRSobj = crsInput)
#...combine
energyDem_re<-rbind(energyDem_re[,c(22,25)],energyDem_re_ms[,c(22,25)])
#energieverbrauch von romand energie
#encoding ein bisschen tricky: erst in z.b. notepad++ öffnen und encoding auf UTF-8 konvertieren
energyVerb_re_rolle<-fread(paste(dataPath,"08_Elektrizitaet_RE/Consommation_Rolle.csv",sep=""),encoding="UTF-8",na.strings = "-")
energyVerb_re_msrolle<-fread(paste(dataPath,"08_Elektrizitaet_RE/Consommation_Mont_sur_Rolle.csv",sep=""),encoding="UTF-8",na.strings = "-")
energyVerb_re<-rbind(energyVerb_re_rolle,energyVerb_re_msrolle)
rm(list=c("energyVerb_re_rolle","energyVerb_re_msrolle"))
adresses<-fread(paste(dataPath,"11_Cadastre_AmtlVermessung/Adresses_9814_JYOEGH/Adresses/OIT_OIT_TPR_PT_ADRESSE.csv",sep=""),encoding="Latin-1",header = F, na.strings = "-")
adresses<-adresses[,c(1,4,8,12,13)]
names(adresses)<-c("id","nr","ad","long","lat")
In diesem Schritt wird anhand der Energiebedarfsfläche (Gebäudefläche * Anzahl Stockwerke) und dem Gebäudealter der jährliche Energieverbrauch geschätzt. Die Schätzung beruht auf Daten aus dem Energieplanungsbereicht des Kantons Zürich aus dem Jahr 2013 (S.19, Abbildung 14). Das Szenario “thomas” beruht auf Annahmen welche im Energiekonzept der Gemeinde Wohlen gemacht wurden (S.19, Abbildung 12).
#function to compute energie use per year from the age and the total area of a building
#different scenarios can be selected
#the conversion of age/are into energy use is based on a study cited in the header
energyUse<-function(age,ebf,scenario="2011"){
if(scenario=="2011"){
age.c<-as.numeric(as.character(
cut(x = age,
breaks=c(1000,1919,1959,1979,1989,1999,2020),
labels=c(137,173,170,127,95,87))))
} else if(scenario=="1990"){
age.c<-as.numeric(as.character(
cut(x = age,
breaks=c(1000,1919,1959,1979,1989,1999,2020),
labels=c(187,217,223,170,100,90))))
}else if(scenario=="2006"){
age.c<-as.numeric(as.character(
cut(x = age,
breaks=c(1000,1919,1959,1979,1989,1999,2020),
labels=c(142,177,180,140,100,90))))
}else if(scenario=="minergie"){
age.c<-as.numeric(as.character(
cut(x = age,
breaks=c(1000,2001,2020),
labels=c(60,38))))
}else if(scenario=="thomas"){
age.c<-as.numeric(as.character(
cut(x = age,
breaks=c(1000,1919,1959,1979,1989,1994,1999,2004,2009,2020),
labels=c(140,178,171,120,95,88,80,70,50))))
}else{
stop("<scenario> should be: 1990, 2006, 2011, minergie or thomas")
}
return(age.c*ebf)
}
age<-as.numeric(rolle_bld_out$GBAUJ)
ebf<-rolle_bld_out$ebf
rolle_bld_out$enerBed_awel<-energyUse(age,ebf,scenario = "thomas")
Die Berechnungen von Stefan Schneider beruhen auf dieser Publikation.
energyDem_ss<-energyDem_ss[,c("GKODX",
"GKODY",
"EnPredCat_Ehww",
"Qh_cc_Est",
"Qww_Est",
"Ehww_Est",
"Ehww_Est_Net")]
coordinates(energyDem_ss)<-~GKODX+GKODY
proj4string(energyDem_ss)<-CRS("+init=epsg:21781")
ov<-over(rolle_bld_out,energyDem_ss)
rolle_bld_out@data<-cbind(rolle_bld_out@data,data.frame(enerBed_ss=ov$Ehww_Est))
rolle_bld_out$enerBed_ss<-rolle_bld_out$enerBed_ss/3.6*rolle_bld_out$ebf
Die Schätzungen beruhen auf Messungen von Romand Energie. Der Wärmebedarf wird anhand des Alters, der EBF und der SIA Gebäudeklasse geschätzt.
rolle_bld_out_pts <- gCentroid(rolle_bld_out,byid=TRUE)
ov<-over(rolle_bld_out_pts,energyDem_re)
rolle_bld_out$enerBed_vd<-ov$CONSO_TOT
Anmerkung: Es haben sich alle Fragen geklärt. Die zwei Messungen pro Wohnung (Hoch- & Niedertarif) wurden summiert. Es können ca. 1/6 der Adressen nicht gefunden werden.
#reformatting the adresse data
adr<-strsplit(adresses$ad,split = " ")
adr<-sapply(adr, function(x){
if(length(x)>1){
return(paste(x[[2]],x[[1]]))
}else{
return(x)
}
})
adr<-tolower(adr)
adr<-gsub("route","rte",adr)
adr<-gsub("chemin","ch.",adr)
adr<-gsub("avenue","av.",adr)
adr<-gsub("passage","pass.",adr)
adr<-gsub("promenade","prom.",adr)
adr<-gsub("route","rte",adr)
adr<-gsub("-"," ",adr)
adr<-gsub("l\' ","l\'",adr)
nr<-adresses$nr
nr[is.na(nr)]<-""
adresses$adrFin<-paste(adr,nr)
adresses$adrFin<-trimws(adresses$adrFin, which = c("both"))
adresses<-adresses[!duplicated(adresses$adrFin),]
#reformatting the energy database
energyVerb_re$adrFin<-tolower(energyVerb_re$`Rue PtConso`)
energyVerb_re$adrFin<-gsub("-"," ",energyVerb_re$adrFin)
energyVerb_re$adrFin<-gsub("l\' ","l\'",energyVerb_re$adrFin)
energyVerb_re$adrFin<-trimws(energyVerb_re$adrFin, which = c("both"))
#join adresses (and coordinates) to energy use
energyVerb_re_j<-left_join(energyVerb_re,adresses,by=c("adrFin","adrFin"))
energyVerb_re_nj<-energyVerb_re[is.na(energyVerb_re_j$lat),]
energyVerb_re_j<-energyVerb_re_j[!is.na(energyVerb_re_j$lat),]
nr<-gsub("[^0-9\\.]", "", nr)
adresses$adrFin<-paste(adr,nr)
adresses$adrFin<-trimws(adresses$adrFin, which = c("both"))
adresses<-adresses[!duplicated(adresses$adrFin),]
energyVerb_re_nj<-left_join(energyVerb_re_nj,adresses,by=c("adrFin","adrFin"))
energyVerb_re<-rbind(energyVerb_re_j,energyVerb_re_nj)
#convert to spatial data
energyVerb_re<-energyVerb_re[!is.na(energyVerb_re$lat),]
ev_sp<-energyVerb_re
coordinates(ev_sp)<-~long+lat
proj4string(ev_sp)<-crsInput
#centroids of bld
bld_centr<-gCentroid(rolle_bld_out,byid = T)
#get a nearest bld for each adresse (since adresses are often not referenced inside bld)
ener_bld_dist<-spDists(ev_sp,bld_centr)
colnames(ener_bld_dist)<-rolle_bld_out$EGID
ener_min_bld<-apply(ener_bld_dist,1,which.min)
ener_min_bld<-rolle_bld_out$EGID[ener_min_bld]
ener_min_dist<-apply(ener_bld_dist,1,min)
#get an EGID for each bld
energyVerb_re$EGID<-ener_min_bld
#only use adresses that are not further than 30m from the nearest bld
energyVerb_re<-energyVerb_re[ener_min_dist<30,]
#compute to sum for two years of monthly electricity measures (and devide by 2)
energyVerb_re$enerVer_re<-rowSums(energyVerb_re[,14:37],na.rm=T)/2
#aggregate the energy use per bld
energyVerb_re_agg <- energyVerb_re%>%
dplyr::group_by(EGID)%>%
dplyr::summarise(enerVer_re=sum(enerVer_re,na.rm=T))
#link energy use to the bld of rolle
dat<-left_join(rolle_bld_out@data,energyVerb_re_agg, by="EGID")
rolle_bld_out@data<-dat
Visualisierung des Stromverbrauchs
#stromverbrauch neuer gebaeude pro m2 EBF
dat<-dat%>%
mutate(enerVer_m2=enerVer_re/ebf)
p1<-ggplot(dat)+
geom_density(aes(x = enerVer_m2, group=sia, fill=sia))+
facet_wrap(.~sia)+
xlim(c(0,100))+
xlab("Stromverbrauch (kW*h/a*m2)")+
theme_minimal()
p2<-dat%>%
filter(sia=="efh" | sia=="mfh" )%>%
filter(!is.na(GBAUP_rough))%>%
ggplot(.)+
geom_density(aes(x = enerVer_m2, group=sia, color=sia))+
facet_wrap(.~GBAUP_rough)+
xlim(c(0,100))+
xlab("Stromverbrauch (kW*h/a*m2)")+
theme_minimal()
grid.arrange(p1,p2,nrow=1)
rolle_bld_out.wgs<-spTransform(rolle_bld_out,CRSobj = CRS("+init=epsg:4326"))
rolle_bld_out.wgs$rel_AWEL_SS<-as.numeric(rolle_bld_out.wgs$enerBed_awel)/as.numeric(rolle_bld_out.wgs$enerBed_ss)
summary(rolle_bld_out.wgs$rel_AWEL_SS)
## Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
## 0.2859 0.8234 1.0886 1.0731 1.2250 3.8679 273
qpal_verb <- colorBin(
palette = "YlGnBu",
domain = rolle_bld_out.wgs$enerVer_re,
bins=quantile(round(rolle_bld_out.wgs$enerVer_re),na.rm=T,seq(0,1,length.out = 8))
)
qpal_rel <- colorBin(
palette = "Spectral",
domain = rolle_bld_out.wgs$rel_AWEL_SS,
bins=c(0,.5,.75,1,1.25,1.5,5)
)
qpal_bed <- colorBin(
palette = "YlGnBu",
domain = c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd),
bins=quantile(c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd),na.rm=T,seq(0,1,length.out = 5))
)
rolle_bld_out.wgs$DemDiff<-rolle_bld_out.wgs$enerBed_awel-rolle_bld_out.wgs$enerBed_ss
rolle_bld_out.wgs.und<-rolle_bld_out.wgs[rolle_bld_out.wgs$DemDiff<0 & !is.na(rolle_bld_out.wgs$DemDiff),]
qpal_under <- colorBin(
palette = "YlGnBu",
reverse = T,
domain = rolle_bld_out.wgs.und$DemDiff,
bins=quantile(rolle_bld_out.wgs.und$DemDiff,na.rm=T,seq(0,1,length.out = 5))
)
rolle_bld_out.wgs.ov<-rolle_bld_out.wgs[rolle_bld_out.wgs$DemDiff>=0 & !is.na(rolle_bld_out.wgs$DemDiff),]
qpal_over<- colorBin(
palette = "YlOrRd",
domain = rolle_bld_out.wgs.ov$DemDiff,
bins=quantile(rolle_bld_out.wgs.ov$DemDiff,na.rm=T,seq(0,1,length.out = 5))
)
#visualisierung mit leaflet
m <- leaflet() %>%
addProviderTiles(providers$OpenStreetMap, group = "normal") %>%
addProviderTiles(providers$Stamen.TonerLite, group = "OSM (b/w)") %>%
addProviderTiles("Esri.WorldImagery", group = "ESRI") %>%
addPolygons(data=rolle_bld_out.wgs,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_bed(rolle_bld_out.wgs$enerBed_awel),
weight=1,
popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_awel)),
group = "Energiebedarf (AWEL)")%>%
addPolygons(data=rolle_bld_out.wgs,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_bed(rolle_bld_out.wgs$enerBed_ss),
weight=1,
popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_ss)),
group = "Energiebedarf (S.Schneid.)")%>%
addPolygons(data=rolle_bld_out.wgs,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_bed(rolle_bld_out.wgs$enerBed_vd),
weight=1,
popup=paste(sep=" / ",rolle_bld_out.wgs$sia,rolle_bld_out.wgs$GBAUJ,round(rolle_bld_out.wgs$ebf),rolle_bld_out.wgs$GENWW_text,round(rolle_bld_out.wgs$enerBed_vd)),
group = "Energiebedarf (VD / RE)")%>%
addPolygons(data=rolle_bld_out.wgs.ov,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_over(rolle_bld_out.wgs.ov$DemDiff),
weight=1,
popup = as.character(rolle_bld_out.wgs.ov$DemDiff),
group = "Energiebedarf (AWEL > SS)")%>%
addPolygons(data=rolle_bld_out.wgs.und,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_under(rolle_bld_out.wgs.und$DemDiff),
weight=1,
popup = as.character(rolle_bld_out.wgs.und$DemDiff),
group = "Energiebedarf (AWEL < SS)")%>%
addPolygons(data=rolle_bld_out.wgs,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_verb(rolle_bld_out.wgs$enerVer_re),
weight=1,
popup = paste("Bedarf (AWEL):",rolle_bld_out.wgs$enerBed_awel,"/ Verbrauch (RE):",rolle_bld_out.wgs$enerVer_re),
group = "Energieverbrauch (RE)")%>%
addPolygons(data=rolle_bld_out.wgs,
stroke = TRUE,
fillOpacity = 0.8,
color = ~qpal_rel(rolle_bld_out.wgs$rel_AWEL_SS),
weight=1,
group = "Energiebedarf (Rel AWEL/SS)")%>%
addLayersControl(
baseGroups = c("OSM (b/w)","normal", "ESRI"),
overlayGroups = c("Energiebedarf (AWEL)","Energiebedarf (S.Schneid.)","Energiebedarf (VD / RE)","Energiebedarf (AWEL > SS)","Energiebedarf (AWEL < SS)","Energieverbrauch (RE)","Energiebedarf (Rel AWEL/SS)"),
options = layersControlOptions(collapsed = F)
)%>%
addLegend(pal = qpal_bed,
values =c(rolle_bld_out.wgs$enerBed_awel,rolle_bld_out.wgs$enerBed_ss,rolle_bld_out.wgs$enerBed_vd),
opacity = 1,
title = "Energiebedarf: kWh/a",
position = "bottomleft"
)%>%
addLegend(pal = qpal_over,
values =rolle_bld_out.wgs.ov$DemDiff,
opacity = 1,
title = "AWEL > SS: kWh/a",
position = "bottomleft"
)%>%
addLegend(pal = qpal_under,
values =rolle_bld_out.wgs.und$DemDiff,
opacity = 1,
title = "AWEL < SS: kWh/a",
position = "bottomleft"
)%>%
addLegend(pal = qpal_verb,
values =rolle_bld_out.wgs$enerVer_re,
opacity = 1,
title = "Energieverbrauch (RE): kWh/a",
position = "bottomleft"
)%>%
addLegend(pal = qpal_rel,
values =rolle_bld_out.wgs$rel_AWEL_SS,
opacity = 1,
title = "Energieverbrauch (Rel): %",
position = "bottomleft"
)%>%
hideGroup(c("Energiebedarf (S.Schneid.)","Energiebedarf (VD / RE)","Energiebedarf (AWEL > SS)","Energiebedarf (AWEL < SS)","Energieverbrauch (RE)","Energiebedarf (Rel AWEL/SS)"))
## Warning in qpal_verb(rolle_bld_out.wgs$enerVer_re): Some values were
## outside the color scale and will be treated as NA
## Warning in qpal_verb(rolle_bld_out.wgs$enerVer_re): Some values were
## outside the color scale and will be treated as NA
#leaflet karte ausführen
m
#html karte speichern
wd<-getwd()
htmlwidgets::saveWidget(m, file=paste(wd,"/output/03_output/map/mapEnergy.html",sep=""),selfcontained = T)
#buildings speichern
save(rolle_bld_out,file="output/03_output/geom/03_rolle_bld_out.Rdata")